package java8.stream;

import java8.Employee;

import java.util.*;

/**
 * Stream的中间操作
 * 筛选（filter、distinct）与切片（limit、skip）
 * 映射（map、flatMap）
 * 排序（sorted）
 */
public class Stream2 {

    private static List<Employee> employees = Arrays.asList(
            new Employee("apple", 18, 9999.99),
            new Employee("banana", 58, 5555.55),
            new Employee("cat", 26, 3333.33),
            new Employee("dog", 36, 6666.66),
            new Employee("edge", 12, 8888.88),
            new Employee("edge", 12, 8888.88),
            new Employee("edge", 12, 8888.88)
    );

    public static void main(String[] args) {
//        filter();
//        limit();
//        skip();
//        distinct();

//        map();
        flatMap();

//        sort();
    }

    public static void filter() {
        // 按条件过滤
        employees.stream()
                .filter(e -> e.getAge() > 35)
                .forEach(System.out::println);
    }

    public static void limit() {
        // 只取前多少个
        employees.stream()
                .limit(3)
                .forEach(System.out::println);
    }

    public static void skip() {
        // 跳过前多少个
        employees.stream()
                .skip(3)
                .forEach(System.out::println);
    }

    public static void distinct() {
        // 通过hashcode()和equals()去重
        employees.stream()
                .distinct()
                .forEach(System.out::println);
    }

    public static void map() {
        // 映射
        employees.stream()
                .map(Employee::getName)
                .forEach(System.out::println);
    }

    public static void flatMap() {
        // 扁平流
        employees.stream()
                .flatMap(e -> {
                    List<Character> list = new ArrayList<>(e.getName().length());
                    for (char c : e.getName().toCharArray()) {
                        list.add(c);
                    }
                    return list.stream();
                })
                .forEach(System.out::println);
    }

    public static void sorted() {
        // 按年龄排序（升序）
        employees.stream()
                .sorted(Comparator.comparingInt(Employee::getAge))
                .forEach(System.out::println);
    }
}
